All cancer cells UMAP

acchigh=read.delim("../data/oncotarget-05-12528-s001_acchigh.txt",skip=0,header=F,sep="\t",stringsAsFactors=F)
acchigh_s=apply(acc_all_cells@assays$RNA@scale.data[intersect(acchigh$V1,acc_all_cells@assays$RNA@var.features),],2,mean)
acchigh_s[acchigh_s < -0.5] = -0.5
acchigh_s[acchigh_s > 0.5] = 0.5
acc_all_cells=AddMetaData(acc_all_cells,acchigh_s,"kaye_acc_score")

CAF markers

FeaturePlot(acc_all_cells, c("COL3A1","COL1A2") ,cols = c("blue","yellow"))

Endothelian markers

FeaturePlot(acc_all_cells, c("VWF","PECAM1") ,cols = c("blue","yellow"))

WBC markers

FeaturePlot(acc_all_cells, c("CD79A","PTPRC") ,cols = c("blue","yellow"))

ACC markers

FeaturePlot(acc_all_cells, c("kaye_acc_score","MYB") ,cols = c("blue","yellow"))

3.Cell types in ACC1

3. UMAP of luminal_over_myo

only cancer cells:

You may also use this plot:

lum_or_myo = FetchData(object = acc_cancer_cells,vars = "luminal_over_myo")
lum_or_myo$luminal_over_myo[lum_or_myo$luminal_over_myo>=1] = "Lum"
lum_or_myo$luminal_over_myo[lum_or_myo$luminal_over_myo<= (-1)] = "Myo"
lum_or_myo$luminal_over_myo[lum_or_myo$luminal_over_myo> (-1) & lum_or_myo$luminal_over_myo<1] = "unassigned"
acc_cancer_cells <- AddMetaData(object = acc_cancer_cells, metadata = lum_or_myo, col.name = "lum_or_myo")

lum_or_myo_by_patient = FetchData(object = acc_cancer_cells,vars = c("lum_or_myo","patient.ident"))


lum_or_myo_by_patient %>% 
  dplyr::count(patient.ident, lum_or_myo) %>% 
  dplyr::add_count(patient.ident, wt = n, name = "overall") %>% 
  mutate(proportion = n / overall) 
NA
lum_or_myo_by_patient = lum_or_myo_by_patient %>% 
  dplyr::count(patient.ident, lum_or_myo) %>% 
  dplyr::add_count(patient.ident, wt = n, name = "overall") %>% 
  mutate(proportion = n / overall) %>% filter(lum_or_myo == "Myo")

ggplot(data=lum_or_myo_by_patient, aes(x=patient.ident, y=proportion)) +
  geom_bar(stat="identity", fill="steelblue")+
  theme_minimal() +ylab("Myo cells %")

4. UMAPS

# acc1_cancer_cells = subset(x = acc_cancer_cells,subset = patient.ident == "ACC1")
# acc1_cancer_cells <- FindVariableFeatures(acc1_cancer_cells, selection.method = "vst", nfeatures = 15000)
# acc1_cancer_cells <- ScaleData(acc1_cancer_cells, vars.to.regress = c("percent.mt","nCount_RNA"))
# acc1_cancer_cells <- RunPCA(acc1_cancer_cells, features = VariableFeatures(object = acc_cancer_cells))
# acc1_cancer_cells <- FindNeighbors(acc1_cancer_cells, dims = 1:10)
# acc1_cancer_cells <- FindClusters(acc1_cancer_cells, resolution = 1)
# acc1_cancer_cells <- RunUMAP(acc1_cancer_cells, dims = 1:10)
# saveRDS(object = acc1_cancer_cells,file = "../Data/acc1_cancer_cells.RDS")
acc1_cancer_cells = readRDS(file = "../Data/acc1_cancer_cells.RDS")
DimPlot(object = acc1_cancer_cells,reduction = "umap")

6. HPV+ cells UMAP

Only HMSC cancer cells:

CNV

CNV for ACC1:

acc1_annotation  = as.data.frame(acc1_all_cells@meta.data[,"seurat_clusters",drop = F])
acc1_annotation = acc1_annotation %>% rownames_to_column("orig.ident") 
acc1_annotation = acc1_annotation %>% mutate(orig.ident = gsub(x = acc1_annotation$orig.ident,pattern = "\\.", replacement = "-") %>% 
  gsub(pattern = "_", replacement = "-"))
  


write.table(acc1_annotation, "../Data/CNV/acc1_annotation.txt", append = FALSE, 
            sep = "\t", dec = ".",row.names = FALSE, col.names = F)

infercnv_obj = CreateInfercnvObject(raw_counts_matrix="../Data/CNV/all.4icnv.txt", 
                                    annotations_file="../Data/CNV/acc1_annotation.txt",
                                    delim="\t",gene_order_file="../Data/CNV/gencode_v19_gene_pos.txt"
                                    ,ref_group_names=c("0", "6", "7", "8", "9")) #groups of normal cells

plot = FeaturePlot(acc1_all_cells, c("VWF") ,cols = c("blue","yellow"))
HoverLocator(plot = plot, information = FetchData(acc_all_cells, vars = c("VWF", "PECAM1","cell.type")))
Warning: the condition has length > 1 and only the first element will be usedWarning: the condition has length > 1 and only the first element will be usedWarning: `error_y.color` does not currently support multiple values.Warning: `error_x.color` does not currently support multiple values.Warning: `line.color` does not currently support multiple values.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.Warning: the condition has length > 1 and only the first element will be usedWarning: the condition has length > 1 and only the first element will be usedWarning: `error_y.color` does not currently support multiple values.Warning: `error_x.color` does not currently support multiple values.Warning: `line.color` does not currently support multiple values.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.
plot = FeaturePlot(acc1_all_cells, c("PECAM1") ,cols = c("blue","yellow"))
HoverLocator(plot = plot, information = FetchData(acc_all_cells, vars = c("VWF", "PECAM1","cell.type")))
Warning: the condition has length > 1 and only the first element will be usedWarning: the condition has length > 1 and only the first element will be usedWarning: `error_y.color` does not currently support multiple values.Warning: `error_x.color` does not currently support multiple values.Warning: `line.color` does not currently support multiple values.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.Warning: the condition has length > 1 and only the first element will be usedWarning: the condition has length > 1 and only the first element will be usedWarning: `error_y.color` does not currently support multiple values.Warning: `error_x.color` does not currently support multiple values.Warning: `line.color` does not currently support multiple values.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.
plot = FeaturePlot(acc1_all_cells, c("COL3A1") ,cols = c("blue","yellow"))
HoverLocator(plot = plot, information = FetchData(acc1_all_cells, vars = c("COL3A1", "COL1A2","cell.type")))
Warning: the condition has length > 1 and only the first element will be usedWarning: the condition has length > 1 and only the first element will be usedWarning: `error_y.color` does not currently support multiple values.Warning: `error_x.color` does not currently support multiple values.Warning: `line.color` does not currently support multiple values.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.Warning: the condition has length > 1 and only the first element will be usedWarning: the condition has length > 1 and only the first element will be usedWarning: `error_y.color` does not currently support multiple values.Warning: `error_x.color` does not currently support multiple values.Warning: `line.color` does not currently support multiple values.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.
plot = FeaturePlot(acc1_all_cells, c("COL1A2") ,cols = c("blue","yellow"))
HoverLocator(plot = plot, information = FetchData(acc1_all_cells, vars = c("COL3A1", "COL1A2","cell.type")))
Warning: the condition has length > 1 and only the first element will be usedWarning: the condition has length > 1 and only the first element will be usedWarning: `error_y.color` does not currently support multiple values.Warning: `error_x.color` does not currently support multiple values.Warning: `line.color` does not currently support multiple values.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.Warning: the condition has length > 1 and only the first element will be usedWarning: the condition has length > 1 and only the first element will be usedWarning: `error_y.color` does not currently support multiple values.Warning: `error_x.color` does not currently support multiple values.Warning: `line.color` does not currently support multiple values.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.
DimPlot(object = acc_all_cells, reduction = "umap", pt.size = 1,cells.highlight= selected_group,
        group.by = "patient.ident", label = TRUE) +
  scale_color_manual(labels = c("unselected", "ACC1"), values = c("grey", "red"))
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.

acc_all_cells = SetIdent(object = acc_all_cells,value = "patient.ident")
selected_group <- WhichCells(acc_all_cells, idents = "ACC1")

acc1_plot = DimPlot(object = acc_all_cells, reduction = "umap", pt.size = 1,cells.highlight= selected_group,
        group.by = "patient.ident", label = TRUE) +
  scale_color_manual(labels = c("unselected", "ACC1"), values = c("grey", "red"))
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
HoverLocator(plot = acc1_plot, information = FetchData(acc1_all_cells, vars = c("cell.type")))
Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.Warning: The titlefont attribute is deprecated. Use title = list(font = ...) instead.

FeaturePlot(object = acc1_cancer_cells,features = c("KIT","CLDN3","ANXA8","EHF","ELF5","KRT7","CLDN4","LCN2","LGALS3","WFDC2","ATP1B1","CD24")
            ,slot = "scale.data")

FeaturePlot(object = acc1_cancer_cells,features = c("TP63","TP73","CDH3","KRT14","KRT5","ACTA2","CDH11","TAGLN","MYLK","DKK3","SPARC","TRIM29")
            ,slot = "scale.data")

correlation of lum/myp markers

lum_markers  = FetchData(object = acc1_cancer_cells, vars = 
                 c("KIT","CLDN3","ANXA8","EHF","ELF5","KRT7","CLDN4","LCN2","LGALS3","WFDC2","ATP1B1","CD24"))
lum_cor = cor(lum_markers)
pheatmap(lum_cor)

myo_markers  = FetchData(object = acc1_cancer_cells, vars = 
                 c("TP63","TP73","CDH3","KRT14","KRT5","ACTA2","CDH11","TAGLN","MYLK","DKK3","SPARC","TRIM29"))
myo_cor = cor(myo_markers)
pheatmap(myo_cor)

myo_proteins = FetchData(object = acc1_cancer_cells,vars = c("CNN1"))
myo_proteins_cor = cor(myo_markers,myo_proteins)
pheatmap(myo_proteins_cor,cluster_cols = F, cluster_rows = F,display_numbers = T)

a = colnames(acc_all_cells) %>% as.data.frame()
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KDQojIEFsbCBjYW5jZXIgY2VsbHMgVU1BUA0KDQpgYGB7ciBlY2hvPVRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShTZXVyYXQpDQpsaWJyYXJ5KGRwbHlyKQ0KYWNjX2FsbF9jZWxscyA9IHJlYWRSRFMoIi4uL0RhdGEvYWNjX3RwbV9uQ291bnRfbWl0b19ubzE0Nl8xNWtfYWxsZGF0YV93aXRoX0FDQzEucmRzIikNCkRpbVBsb3QoYWNjX2FsbF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFRSVUUsIHB0LnNpemUgPSAxLGdyb3VwLmJ5ID0gInBhdGllbnQuaWRlbnQiKSANCg0KYGBgDQoNCg0KYGBge3J9DQphY2NoaWdoPXJlYWQuZGVsaW0oIi4uL2RhdGEvb25jb3RhcmdldC0wNS0xMjUyOC1zMDAxX2FjY2hpZ2gudHh0Iixza2lwPTAsaGVhZGVyPUYsc2VwPSJcdCIsc3RyaW5nc0FzRmFjdG9ycz1GKQ0KYWNjaGlnaF9zPWFwcGx5KGFjY19hbGxfY2VsbHNAYXNzYXlzJFJOQUBzY2FsZS5kYXRhW2ludGVyc2VjdChhY2NoaWdoJFYxLGFjY19hbGxfY2VsbHNAYXNzYXlzJFJOQUB2YXIuZmVhdHVyZXMpLF0sMixtZWFuKQ0KYWNjaGlnaF9zW2FjY2hpZ2hfcyA8IC0wLjVdID0gLTAuNQ0KYWNjaGlnaF9zW2FjY2hpZ2hfcyA+IDAuNV0gPSAwLjUNCmFjY19hbGxfY2VsbHM9QWRkTWV0YURhdGEoYWNjX2FsbF9jZWxscyxhY2NoaWdoX3MsImtheWVfYWNjX3Njb3JlIikNCmBgYA0KDQojIENBRiBtYXJrZXJzDQoNCmBgYHtyIGZpZy53aWR0aD0xNX0NCkZlYXR1cmVQbG90KGFjY19hbGxfY2VsbHMsIGMoIkNPTDNBMSIsIkNPTDFBMiIpICxjb2xzID0gYygiYmx1ZSIsInllbGxvdyIpKQ0KYGBgDQoNCiMgRW5kb3RoZWxpYW4gbWFya2Vycw0KDQpgYGB7ciBmaWcud2lkdGg9MTV9DQpGZWF0dXJlUGxvdChhY2NfYWxsX2NlbGxzLCBjKCJWV0YiLCJQRUNBTTEiKSAsY29scyA9IGMoImJsdWUiLCJ5ZWxsb3ciKSkNCg0KYGBgDQoNCiMgV0JDIG1hcmtlcnMNCg0KYGBge3IgZmlnLndpZHRoPTE1fQ0KRmVhdHVyZVBsb3QoYWNjX2FsbF9jZWxscywgYygiQ0Q3OUEiLCJQVFBSQyIpICxjb2xzID0gYygiYmx1ZSIsInllbGxvdyIpKQ0KDQpgYGANCg0KIyBBQ0MgbWFya2Vycw0KDQpgYGB7ciBmaWcud2lkdGg9MTV9DQpGZWF0dXJlUGxvdChhY2NfYWxsX2NlbGxzLCBjKCJrYXllX2FjY19zY29yZSIsIk1ZQiIpICxjb2xzID0gYygiYmx1ZSIsInllbGxvdyIpKQ0KDQpgYGANCg0KIyAzLkNlbGwgdHlwZXMgaW4gQUNDMQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KbmV3LmNsdXN0ZXIuaWRzIDwtIGMoIkNBRiIsDQogICAgICAgICAgICAgICAgICAgICAiQUNDIiwNCiAgICAgICAgICAgICAgICAgICAgICJBQ0MiLA0KICAgICAgICAgICAgICAgICAgICAgIkFDQyIsDQogICAgICAgICAgICAgICAgICAgICAiQUNDIiwNCiAgICAgICAgICAgICAgICAgICAgICJBQ0MiLA0KICAgICAgICAgICAgICAgICAgICAgIkVORE9USEVMSUFOIiwNCiAgICAgICAgICAgICAgICAgICAgICJDQUYiLA0KICAgICAgICAgICAgICAgICAgICAgIkNBRiIsDQogICAgICAgICAgICAgICAgICAgICAiQ0FGIiwNCiAgICAgICAgICAgICAgICAgICAgICJBQ0MiLA0KICAgICAgICAgICAgICAgICAgICAgIkFDQyIsDQogICAgICAgICAgICAgICAgICAgICAiQUNDIikNCm5hbWVzKG5ldy5jbHVzdGVyLmlkcykgPC0gbGV2ZWxzKGFjY19hbGxfY2VsbHMpDQphY2NfYWxsX2NlbGxzID0gU2V0SWRlbnQob2JqZWN0ID0gYWNjX2FsbF9jZWxscyx2YWx1ZSA9ICJzZXVyYXRfY2x1c3RlcnMiKQ0KYWNjX2FsbF9jZWxscyA8LSBSZW5hbWVJZGVudHMoYWNjX2FsbF9jZWxscywgbmV3LmNsdXN0ZXIuaWRzKQ0KcGxvdDEgPSBEaW1QbG90KGFjY19hbGxfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMC41KSANCkhvdmVyTG9jYXRvcihwbG90ID0gcGxvdDEsIGluZm9ybWF0aW9uID0gRmV0Y2hEYXRhKGFjY19hbGxfY2VsbHMsIHZhcnMgPSBjKCJwYXRpZW50LmlkZW50IikpKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KY2VsbC50eXBlIDwtIGFjY19hbGxfY2VsbHNAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycw0KbGV2ZWxzKGNlbGwudHlwZSkgPC0gbmV3LmNsdXN0ZXIuaWRzDQphY2NfYWxsX2NlbGxzIDwtIEFkZE1ldGFEYXRhKG9iamVjdCA9IGFjY19hbGxfY2VsbHMsIG1ldGFkYXRhID0gYXMuZmFjdG9yKGNlbGwudHlwZSksIGNvbC5uYW1lID0gImNlbGwudHlwZSIpDQoNCmFjYzFfYWxsX2NlbGxzID0gc3Vic2V0KHggPSBhY2NfYWxsX2NlbGxzLHN1YnNldCA9IHBhdGllbnQuaWRlbnQgPT0gIkFDQzEiKQ0KYWNjMV90eXBlcyA9IGFjYzFfYWxsX2NlbGxzQG1ldGEuZGF0YVtbImNlbGwudHlwZSJdXSAlPiUgdGFibGUoKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQpuYW1lcyhhY2MxX3R5cGVzKVsxXSA9ICJ0eXBlIg0KZ2dwbG90KGRhdGE9YWNjMV90eXBlcywgYWVzKHg9dHlwZSwgeT1GcmVxKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9InN0ZWVsYmx1ZSIpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPUZyZXEpLCB2anVzdD0tMC41LCBjb2xvcj0iYmxhY2siLCBzaXplPTMuNSkNCmBgYA0KDQojIDMuIFVNQVAgb2YgbHVtaW5hbF9vdmVyX215bw0KDQpvbmx5IGNhbmNlciBjZWxsczoNCg0KYGBge3J9DQojIGFjY19jYW5jZXJfY2VsbHMgPSBzdWJzZXQoeCA9IGFjY19hbGxfY2VsbHMsc3Vic2V0ID0gY2VsbC50eXBlID09ICJBQ0MiKQ0KIyBhY2NfY2FuY2VyX2NlbGxzIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKGFjY19jYW5jZXJfY2VsbHMsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMTUwMDApDQojIGFjY19jYW5jZXJfY2VsbHMgPC0gU2NhbGVEYXRhKGFjY19jYW5jZXJfY2VsbHMsIHZhcnMudG8ucmVncmVzcyA9IGMoInBlcmNlbnQubXQiLCJuQ291bnRfUk5BIikpDQojIGFjY19jYW5jZXJfY2VsbHMgPC0gUnVuUENBKGFjY19jYW5jZXJfY2VsbHMsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhvYmplY3QgPSBhY2NfY2FuY2VyX2NlbGxzKSkNCiMgYWNjX2NhbmNlcl9jZWxscyA8LSBGaW5kTmVpZ2hib3JzKGFjY19jYW5jZXJfY2VsbHMsIGRpbXMgPSAxOjEwKQ0KIyBhY2NfY2FuY2VyX2NlbGxzIDwtIEZpbmRDbHVzdGVycyhhY2NfY2FuY2VyX2NlbGxzLCByZXNvbHV0aW9uID0gMSkNCiMgYWNjX2NhbmNlcl9jZWxscyA8LSBSdW5VTUFQKGFjY19jYW5jZXJfY2VsbHMsIGRpbXMgPSAxOjEwKQ0KIyBzYXZlUkRTKG9iamVjdCA9IGFjY19jYW5jZXJfY2VsbHMsZmlsZSA9ICIuLi9EYXRhL2FjY19jYW5jZXJfY2VsbHMuUkRTIikNCg0KYWNjX2NhbmNlcl9jZWxscyA9IHJlYWRSRFMoIi4uL0RhdGEvYWNjX2NhbmNlcl9jZWxscy5SRFMiKQ0KDQpEaW1QbG90KG9iamVjdCA9IGFjY19jYW5jZXJfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgcHQuc2l6ZSA9IDEsIGxhYmVsID0gRixncm91cC5ieSA9ICJwYXRpZW50LmlkZW50IikNCg0KbXlvc2NvcmU9YXBwbHkoYWNjX2NhbmNlcl9jZWxsc0Bhc3NheXNbWyJSTkEiXV1bYygiVFA2MyIsIlRQNzMiLCJDREgzIiwiS1JUMTQiLCJLUlQ1IiwiQUNUQTIiLCJDREgxMSIsIlRBR0xOIiwiTVlMSyIsIkRLSzMiLCJTUEFSQyIsIlRSSU0yOSIpLF0sMixtZWFuKQ0KbGVzY29yZT1hcHBseShhY2NfY2FuY2VyX2NlbGxzQGFzc2F5c1tbIlJOQSJdXVtjKCJLSVQiLCJDTEROMyIsIkFOWEE4IiwiRUhGIiwiRUxGNSIsIktSVDciLCJDTERONCIsIkxDTjIiLCJMR0FMUzMiLCJXRkRDMiIsIkFUUDFCMSIsIkNEMjQiKSxdLDIsbWVhbikNCmFjY19jYW5jZXJfY2VsbHM9QWRkTWV0YURhdGEoYWNjX2NhbmNlcl9jZWxscyxsZXNjb3JlLW15b3Njb3JlLCJsdW1pbmFsX292ZXJfbXlvIikNCkZlYXR1cmVQbG90KG9iamVjdCA9IGFjY19jYW5jZXJfY2VsbHMsZmVhdHVyZXMgPSAibHVtaW5hbF9vdmVyX215byIpDQpgYGANCg0KWW91IG1heSBhbHNvIHVzZSB0aGlzIHBsb3Q6DQoNCmBgYHtyfQ0KbHVtX29yX215byA9IEZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FuY2VyX2NlbGxzLHZhcnMgPSAibHVtaW5hbF9vdmVyX215byIpDQpsdW1fb3JfbXlvJGx1bWluYWxfb3Zlcl9teW9bbHVtX29yX215byRsdW1pbmFsX292ZXJfbXlvPj0xXSA9ICJMdW0iDQpsdW1fb3JfbXlvJGx1bWluYWxfb3Zlcl9teW9bbHVtX29yX215byRsdW1pbmFsX292ZXJfbXlvPD0gKC0xKV0gPSAiTXlvIg0KbHVtX29yX215byRsdW1pbmFsX292ZXJfbXlvW2x1bV9vcl9teW8kbHVtaW5hbF9vdmVyX215bz4gKC0xKSAmIGx1bV9vcl9teW8kbHVtaW5hbF9vdmVyX215bzwxXSA9ICJ1bmFzc2lnbmVkIg0KYWNjX2NhbmNlcl9jZWxscyA8LSBBZGRNZXRhRGF0YShvYmplY3QgPSBhY2NfY2FuY2VyX2NlbGxzLCBtZXRhZGF0YSA9IGx1bV9vcl9teW8sIGNvbC5uYW1lID0gImx1bV9vcl9teW8iKQ0KDQpsdW1fb3JfbXlvX2J5X3BhdGllbnQgPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjX2NhbmNlcl9jZWxscyx2YXJzID0gYygibHVtX29yX215byIsInBhdGllbnQuaWRlbnQiKSkNCg0KDQpsdW1fb3JfbXlvX2J5X3BhdGllbnQgJT4lIA0KICBkcGx5cjo6Y291bnQocGF0aWVudC5pZGVudCwgbHVtX29yX215bykgJT4lIA0KICBkcGx5cjo6YWRkX2NvdW50KHBhdGllbnQuaWRlbnQsIHd0ID0gbiwgbmFtZSA9ICJvdmVyYWxsIikgJT4lIA0KICBtdXRhdGUocHJvcG9ydGlvbiA9IG4gLyBvdmVyYWxsKSANCg0KYGBgDQoNCmBgYHtyfQ0KbHVtX29yX215b19ieV9wYXRpZW50ID0gbHVtX29yX215b19ieV9wYXRpZW50ICU+JSANCiAgZHBseXI6OmNvdW50KHBhdGllbnQuaWRlbnQsIGx1bV9vcl9teW8pICU+JSANCiAgZHBseXI6OmFkZF9jb3VudChwYXRpZW50LmlkZW50LCB3dCA9IG4sIG5hbWUgPSAib3ZlcmFsbCIpICU+JSANCiAgbXV0YXRlKHByb3BvcnRpb24gPSBuIC8gb3ZlcmFsbCkgJT4lIGZpbHRlcihsdW1fb3JfbXlvID09ICJNeW8iKQ0KDQpnZ3Bsb3QoZGF0YT1sdW1fb3JfbXlvX2J5X3BhdGllbnQsIGFlcyh4PXBhdGllbnQuaWRlbnQsIHk9cHJvcG9ydGlvbikpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJzdGVlbGJsdWUiKSsNCiAgdGhlbWVfbWluaW1hbCgpICt5bGFiKCJNeW8gY2VsbHMgJSIpDQoNCmBgYA0KDQojIDQuIFVNQVBTDQoNCmBgYHtyIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0xMH0NCm15b3Njb3JlPWFwcGx5KGFjY19jYW5jZXJfY2VsbHNAYXNzYXlzW1siUk5BIl1dW2MoIlRQNjMiLCJUUDczIiwiQ0RIMyIsIktSVDE0IiwiS1JUNSIsIkFDVEEyIiwiQ0RIMTEiLCJUQUdMTiIsIk1ZTEsiLCJES0szIiwiU1BBUkMiLCJUUklNMjkiKSxdLDIsbWVhbikNCmxlc2NvcmU9YXBwbHkoYWNjX2NhbmNlcl9jZWxsc0Bhc3NheXNbWyJSTkEiXV1bYygiS0lUIiwiQ0xETjMiLCJBTlhBOCIsIkVIRiIsIkVMRjUiLCJLUlQ3IiwiQ0xETjQiLCJMQ04yIiwiTEdBTFMzIiwiV0ZEQzIiLCJBVFAxQjEiLCJDRDI0IiksXSwyLG1lYW4pDQphY2NfY2FuY2VyX2NlbGxzPUFkZE1ldGFEYXRhKGFjY19jYW5jZXJfY2VsbHMsbXlvc2NvcmUsIm15b19zY29yZSIpDQphY2NfY2FuY2VyX2NlbGxzPUFkZE1ldGFEYXRhKGFjY19jYW5jZXJfY2VsbHMsbGVzY29yZSwibHVtX2NvcmUiKQ0KRmVhdHVyZVBsb3Qob2JqZWN0ID0gYWNjX2NhbmNlcl9jZWxscyxmZWF0dXJlcyA9IGMoIklMMTJCIiwiVFA2MyIsICJDTk4xIiwgIkFDVEEyIiwibXlvX3Njb3JlIiwibHVtX2NvcmUiICApKQ0KYGBgDQoNCmBgYHtyfQ0KIyBhY2MxX2NhbmNlcl9jZWxscyA9IHN1YnNldCh4ID0gYWNjX2NhbmNlcl9jZWxscyxzdWJzZXQgPSBwYXRpZW50LmlkZW50ID09ICJBQ0MxIikNCiMgYWNjMV9jYW5jZXJfY2VsbHMgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoYWNjMV9jYW5jZXJfY2VsbHMsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMTUwMDApDQojIGFjYzFfY2FuY2VyX2NlbGxzIDwtIFNjYWxlRGF0YShhY2MxX2NhbmNlcl9jZWxscywgdmFycy50by5yZWdyZXNzID0gYygicGVyY2VudC5tdCIsIm5Db3VudF9STkEiKSkNCiMgYWNjMV9jYW5jZXJfY2VsbHMgPC0gUnVuUENBKGFjYzFfY2FuY2VyX2NlbGxzLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMob2JqZWN0ID0gYWNjX2NhbmNlcl9jZWxscykpDQojIGFjYzFfY2FuY2VyX2NlbGxzIDwtIEZpbmROZWlnaGJvcnMoYWNjMV9jYW5jZXJfY2VsbHMsIGRpbXMgPSAxOjEwKQ0KIyBhY2MxX2NhbmNlcl9jZWxscyA8LSBGaW5kQ2x1c3RlcnMoYWNjMV9jYW5jZXJfY2VsbHMsIHJlc29sdXRpb24gPSAxKQ0KIyBhY2MxX2NhbmNlcl9jZWxscyA8LSBSdW5VTUFQKGFjYzFfY2FuY2VyX2NlbGxzLCBkaW1zID0gMToxMCkNCiMgc2F2ZVJEUyhvYmplY3QgPSBhY2MxX2NhbmNlcl9jZWxscyxmaWxlID0gIi4uL0RhdGEvYWNjMV9jYW5jZXJfY2VsbHMuUkRTIikNCmFjYzFfY2FuY2VyX2NlbGxzID0gcmVhZFJEUyhmaWxlID0gIi4uL0RhdGEvYWNjMV9jYW5jZXJfY2VsbHMuUkRTIikNCkRpbVBsb3Qob2JqZWN0ID0gYWNjMV9jYW5jZXJfY2VsbHMscmVkdWN0aW9uID0gInVtYXAiKQ0KDQpgYGANCg0KIyA2LiBIUFYrIGNlbGxzIFVNQVANCg0KT25seSBITVNDIGNhbmNlciBjZWxsczoNCg0KYGBge3J9DQpsaWJyYXJ5KGRhdGEudGFibGUpDQpIUFYzM19QMyA9IGZyZWFkKCIuLi9EYXRhL0hQVjMzX1AzLnR4dCIsY29sLm5hbWVzID0gYygicGxhdGUiLCJyZWFkcyIpKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQpIUFYzM19QMy5kZiA9IEhQVjMzX1AzICU+JSBtdXRhdGUoDQogIHBsYXRlID0gZ3N1Yih4ID1IUFYzM19QMyRwbGF0ZSwgcmVwbGFjZW1lbnQgPSAiIixwYXR0ZXJuID0gIl8uKiQiKSANCiAgJT4lIGdzdWIocGF0dGVybiA9ICItUCIscmVwbGFjZW1lbnQgPSAiLlAiKSANCiAgJT4lIGdzdWIocGF0dGVybiA9ICItIixyZXBsYWNlbWVudCA9ICJfIiwpDQogICkNCg0KDQoNCkhQVjMzX1AzLmRmID0gSFBWMzNfUDMuZGYgJT4lIGZpbHRlcihIUFYzM19QMy5kZiRwbGF0ZSAlaW4lIGNvbG5hbWVzKGFjYzFfY2FuY2VyX2NlbGxzKSkNCnJvd25hbWVzKEhQVjMzX1AzLmRmKSAgPC0gSFBWMzNfUDMuZGYkcGxhdGUNCiBIUFYzM19QMy5kZiRwbGF0ZSA9IE5VTEwNCmFjYzFfY2FuY2VyX2NlbGxzID0gQWRkTWV0YURhdGEob2JqZWN0ID0gYWNjMV9jYW5jZXJfY2VsbHMsbWV0YWRhdGEgPSBIUFYzM19QMy5kZixjb2wubmFtZSA9ICJIUFYzMy5yZWFkcyIpDQpGZWF0dXJlUGxvdChhY2MxX2NhbmNlcl9jZWxscyxmZWF0dXJlcyA9ICJIUFYzMy5yZWFkcyIsbWF4LmN1dG9mZiA9IDQwKQ0KYGBgDQoNCiMgQ05WDQoNCmBgYHtyIGZpZy53aWR0aD0xMH0NCmxpYnJhcnkoaW5mZXJjbnYpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmFjY19hbm5vdGF0aW9uICA9IGFzLmRhdGEuZnJhbWUoYWNjX2FsbF9jZWxsc0BtZXRhLmRhdGFbLCJzZXVyYXRfY2x1c3RlcnMiLGRyb3AgPSBGXSkNCmFjY19hbm5vdGF0aW9uID0gYWNjX2Fubm90YXRpb24gJT4lIHJvd25hbWVzX3RvX2NvbHVtbigib3JpZy5pZGVudCIpIA0KYWNjX2Fubm90YXRpb24gPSBhY2NfYW5ub3RhdGlvbiAlPiUgbXV0YXRlKG9yaWcuaWRlbnQgPSBnc3ViKHggPSBhY2NfYW5ub3RhdGlvbiRvcmlnLmlkZW50LHBhdHRlcm4gPSAiXFwuIiwgcmVwbGFjZW1lbnQgPSAiLSIpICU+JSANCiAgZ3N1YihwYXR0ZXJuID0gIl8iLCByZXBsYWNlbWVudCA9ICItIikpDQogIA0KDQoNCndyaXRlLnRhYmxlKGFjY19hbm5vdGF0aW9uLCAiLi4vRGF0YS9DTlYvYWNjX2Fubm90YXRpb24udHh0IiwgYXBwZW5kID0gRkFMU0UsIA0KICAgICAgICAgICAgc2VwID0gIlx0IiwgZGVjID0gIi4iLHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBGKQ0KDQppbmZlcmNudl9vYmogPSBDcmVhdGVJbmZlcmNudk9iamVjdChyYXdfY291bnRzX21hdHJpeD0iLi4vRGF0YS9DTlYvYWxsLjRpY252LnR4dCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNfZmlsZT0iLi4vRGF0YS9DTlYvYWNjX2Fubm90YXRpb24udHh0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltPSJcdCIsZ2VuZV9vcmRlcl9maWxlPSIuLi9EYXRhL0NOVi9nZW5jb2RlX3YxOV9nZW5lX3Bvcy50eHQiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscmVmX2dyb3VwX25hbWVzPWMoIjAiLCAiNiIsICI3IiwgIjgiLCAiOSIpKSAjZ3JvdXBzIG9mIG5vcm1hbCBjZWxscw0KDQppbmZlcmNudl9vYmpfZGVmYXVsdCA9IGluZmVyY252OjpydW4oaW5mZXJjbnZfb2JqLCBjdXRvZmY9MSwgb3V0X2Rpcj0nLi4vRGF0YS9DTlYvaW5mZXJjbnZfb3V0cHV0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2J5X2dyb3Vwcz1UUlVFLCBwbG90X3N0ZXBzPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9pc2U9VFJVRSwgSE1NPUZBTFNFLCBub19wcmVsaW1fcGxvdD1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19yZXM9MzAwLCkNCnBsb3RfY252KGluZmVyY252X29ial9kZWZhdWx0LCBvdXRwdXRfZm9ybWF0ID0gInBuZyIsICB3cml0ZV9leHByX21hdHJpeCA9IEZBTFNFLG91dF9kaXIgPSAiLi4vRGF0YS9DTlYvIixwbmdfcmVzCT04MDApDQoNCiMgc2F2ZVJEUyhvYmplY3QgPSBpbmZlcmNudl9vYmosIGZpbGUgPSAiLi4vRGF0YS9DTlYvaW5mZXJjbnZfb2JqLnJkcyIpDQojIHNhdmVSRFMob2JqZWN0ID0gaW5mZXJjbnZfb2JqX2RlZmF1bHQsIGZpbGUgPSAiLi4vRGF0YS9DTlYvaW5mZXJjbnZfb2JqX2RlZmF1bHQucmRzIikNCg0KY2x1c3Rlci5pbmZvPUZldGNoRGF0YShhY2NfYWxsX2NlbGxzLGMoImlkZW50Iiwib3JpZy5pZGVudCIsIlVNQVBfMSIsIlVNQVBfMiIsIm5Db3VudF9STkEiLCJuRmVhdHVyZV9STkEiLCJwZXJjZW50Lm10IiwicGF0aWVudC5pZGVudCIsInNldXJhdF9jbHVzdGVycyIpKQ0KY2x1c3Rlci5pbmZvJGNlbGw9cm93bmFtZXMoY2x1c3Rlci5pbmZvKQ0Kd3JpdGUudGFibGUoY2x1c3Rlci5pbmZvLCIuLi9EYXRhL0NOVi9hY2NfVU1BUF9jbHVzdGVyczIudHh0IixzZXA9Ilx0Iixyb3cubmFtZXM9RkFMU0UpDQoNCmxpYnJhcnkobGltbWEpDQpzbW9vdGhlZD1hcHBseShpbmZlcmNudl9vYmpfZGVmYXVsdEBleHByLmRhdGEsMix0cmljdWJlTW92aW5nQXZlcmFnZSwgc3Bhbj0wLjAxKQ0KY25zaWc9c3FydChhcHBseSgoc21vb3RoZWQtMSleMiwyLG1lYW4pKQ0KdW1hcD1yZWFkLnRhYmxlKCIuLi9EYXRhL0NOVi9hY2NfVU1BUF9jbHVzdGVyczIudHh0IixoZWFkZXIgPSBUUlVFKQ0KbmFtZXMoY25zaWcpPXVtYXAkY2VsbA0KDQojIGNuc2lnW2Nuc2lnPjAuMDhdPTAuMDgNCmFjY19hbGxfY2VsbHMgPC0gQWRkTWV0YURhdGEob2JqZWN0ID0gYWNjX2FsbF9jZWxscywgbWV0YWRhdGEgPSBjbnNpZywgY29sLm5hbWUgPSAiY29weW51bWJlciIpDQpjbnZfcGxvdCA8LUZlYXR1cmVQbG90KGFjY19hbGxfY2VsbHMsICJjb3B5bnVtYmVyIixwdC5zaXplID0gMSwgY29scyA9IGMoImJsdWUiLCJ5ZWxsb3ciKSkNCmNudl9wbG90DQpgYGANCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCkhvdmVyTG9jYXRvcihwbG90ID0gY252X3Bsb3QsIGluZm9ybWF0aW9uID0gRmV0Y2hEYXRhKGFjY19hbGxfY2VsbHMsIHZhcnMgPSBjKCJvcmlnLmlkZW50IiwgImNvcHludW1iZXIiKSkpDQoNCmBgYA0KQ05WIGZvciBBQ0MxOg0KYGBge3J9DQphY2MxX2Fubm90YXRpb24gID0gYXMuZGF0YS5mcmFtZShhY2MxX2FsbF9jZWxsc0BtZXRhLmRhdGFbLCJzZXVyYXRfY2x1c3RlcnMiLGRyb3AgPSBGXSkNCmFjYzFfYW5ub3RhdGlvbiA9IGFjYzFfYW5ub3RhdGlvbiAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJvcmlnLmlkZW50IikgDQphY2MxX2Fubm90YXRpb24gPSBhY2MxX2Fubm90YXRpb24gJT4lIG11dGF0ZShvcmlnLmlkZW50ID0gZ3N1Yih4ID0gYWNjMV9hbm5vdGF0aW9uJG9yaWcuaWRlbnQscGF0dGVybiA9ICJcXC4iLCByZXBsYWNlbWVudCA9ICItIikgJT4lIA0KICBnc3ViKHBhdHRlcm4gPSAiXyIsIHJlcGxhY2VtZW50ID0gIi0iKSkNCiAgDQoNCg0Kd3JpdGUudGFibGUoYWNjMV9hbm5vdGF0aW9uLCAiLi4vRGF0YS9DTlYvYWNjMV9hbm5vdGF0aW9uLnR4dCIsIGFwcGVuZCA9IEZBTFNFLCANCiAgICAgICAgICAgIHNlcCA9ICJcdCIsIGRlYyA9ICIuIixyb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gRikNCg0KaW5mZXJjbnZfb2JqID0gQ3JlYXRlSW5mZXJjbnZPYmplY3QocmF3X2NvdW50c19tYXRyaXg9Ii4uL0RhdGEvQ05WL2FsbC40aWNudi50eHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zX2ZpbGU9Ii4uL0RhdGEvQ05WL2FjYzFfYW5ub3RhdGlvbi50eHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW09Ilx0IixnZW5lX29yZGVyX2ZpbGU9Ii4uL0RhdGEvQ05WL2dlbmNvZGVfdjE5X2dlbmVfcG9zLnR4dCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxyZWZfZ3JvdXBfbmFtZXM9YygiMCIsICI2IiwgIjciLCAiOCIsICI5IikpICNncm91cHMgb2Ygbm9ybWFsIGNlbGxzDQpgYGANCg0KYGBge3J9DQpEaW1QbG90KG9iamVjdCA9IGFjYzFfYWxsX2NlbGxzLHJlZHVjdGlvbiA9ICJ1bWFwIixsYWJlbCA9IFQpDQpgYGANCmBgYHtyfQ0KcGxvdCA9IEZlYXR1cmVQbG90KGFjYzFfYWxsX2NlbGxzLCBjKCJWV0YiKSAsY29scyA9IGMoImJsdWUiLCJ5ZWxsb3ciKSkNCkhvdmVyTG9jYXRvcihwbG90ID0gcGxvdCwgaW5mb3JtYXRpb24gPSBGZXRjaERhdGEoYWNjX2FsbF9jZWxscywgdmFycyA9IGMoIlZXRiIsICJQRUNBTTEiLCJjZWxsLnR5cGUiKSkpDQoNCnBsb3QgPSBGZWF0dXJlUGxvdChhY2MxX2FsbF9jZWxscywgYygiUEVDQU0xIikgLGNvbHMgPSBjKCJibHVlIiwieWVsbG93IikpDQpIb3ZlckxvY2F0b3IocGxvdCA9IHBsb3QsIGluZm9ybWF0aW9uID0gRmV0Y2hEYXRhKGFjY19hbGxfY2VsbHMsIHZhcnMgPSBjKCJWV0YiLCAiUEVDQU0xIiwiY2VsbC50eXBlIikpKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdCA9IEZlYXR1cmVQbG90KGFjYzFfYWxsX2NlbGxzLCBjKCJDT0wzQTEiKSAsY29scyA9IGMoImJsdWUiLCJ5ZWxsb3ciKSkNCkhvdmVyTG9jYXRvcihwbG90ID0gcGxvdCwgaW5mb3JtYXRpb24gPSBGZXRjaERhdGEoYWNjMV9hbGxfY2VsbHMsIHZhcnMgPSBjKCJDT0wzQTEiLCAiQ09MMUEyIiwiY2VsbC50eXBlIikpKQ0KDQpwbG90ID0gRmVhdHVyZVBsb3QoYWNjMV9hbGxfY2VsbHMsIGMoIkNPTDFBMiIpICxjb2xzID0gYygiYmx1ZSIsInllbGxvdyIpKQ0KSG92ZXJMb2NhdG9yKHBsb3QgPSBwbG90LCBpbmZvcm1hdGlvbiA9IEZldGNoRGF0YShhY2MxX2FsbF9jZWxscywgdmFycyA9IGMoIkNPTDNBMSIsICJDT0wxQTIiLCJjZWxsLnR5cGUiKSkpDQpgYGANCg0KYGBge3J9DQphY2NfYWxsX2NlbGxzID0gU2V0SWRlbnQob2JqZWN0ID0gYWNjX2FsbF9jZWxscyx2YWx1ZSA9ICJwYXRpZW50LmlkZW50IikNCnNlbGVjdGVkX2dyb3VwIDwtIFdoaWNoQ2VsbHMoYWNjX2FsbF9jZWxscywgaWRlbnRzID0gIkFDQzEiKQ0KDQpEaW1QbG90KG9iamVjdCA9IGFjY19hbGxfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgcHQuc2l6ZSA9IDEsY2VsbHMuaGlnaGxpZ2h0PSBzZWxlY3RlZF9ncm91cCwNCiAgICAgICAgZ3JvdXAuYnkgPSAicGF0aWVudC5pZGVudCIsIGxhYmVsID0gVFJVRSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygidW5zZWxlY3RlZCIsICJBQ0MxIiksIHZhbHVlcyA9IGMoImdyZXkiLCAicmVkIikpDQoNCg0KDQpgYGANCg0KYGBge3J9DQphY2NfYWxsX2NlbGxzID0gU2V0SWRlbnQob2JqZWN0ID0gYWNjX2FsbF9jZWxscyx2YWx1ZSA9ICJwYXRpZW50LmlkZW50IikNCnNlbGVjdGVkX2dyb3VwIDwtIFdoaWNoQ2VsbHMoYWNjX2FsbF9jZWxscywgaWRlbnRzID0gIkFDQzEiKQ0KDQphY2MxX3Bsb3QgPSBEaW1QbG90KG9iamVjdCA9IGFjY19hbGxfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgcHQuc2l6ZSA9IDEsY2VsbHMuaGlnaGxpZ2h0PSBzZWxlY3RlZF9ncm91cCwNCiAgICAgICAgZ3JvdXAuYnkgPSAicGF0aWVudC5pZGVudCIsIGxhYmVsID0gVFJVRSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygidW5zZWxlY3RlZCIsICJBQ0MxIiksIHZhbHVlcyA9IGMoImdyZXkiLCAicmVkIikpDQoNCkhvdmVyTG9jYXRvcihwbG90ID0gYWNjMV9wbG90LCBpbmZvcm1hdGlvbiA9IEZldGNoRGF0YShhY2MxX2FsbF9jZWxscywgdmFycyA9IGMoImNlbGwudHlwZSIpKSkNCg0KYGBgDQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0NCmxpYnJhcnkocGhlYXRtYXApDQphY2MxX2FsbF9jZWxscy5kZiA9IGFjYzFfYWxsX2NlbGxzQGFzc2F5c1tbIlJOQSJdXUBkYXRhICU+JSBhcy5kYXRhLmZyYW1lKCkNCmFjYzFfY29yID0gY29yKGFjYzFfYWxsX2NlbGxzLmRmKQ0KYW5ub3RhdGlvbiA9IEZldGNoRGF0YShvYmplY3QgPSBhY2MxX2FsbF9jZWxscyx2YXJzID0gYygiY2VsbC50eXBlIikpDQpwaGVhdG1hcChhY2MxX2Nvcixhbm5vdGF0aW9uX3JvdyA9IGFubm90YXRpb24sZm9udHNpemUgPSA2KQ0KYGBgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMn0NCkZlYXR1cmVQbG90KG9iamVjdCA9IGFjYzFfY2FuY2VyX2NlbGxzLGZlYXR1cmVzID0gYygiS0lUIiwiQ0xETjMiLCJBTlhBOCIsIkVIRiIsIkVMRjUiLCJLUlQ3IiwiQ0xETjQiLCJMQ04yIiwiTEdBTFMzIiwiV0ZEQzIiLCJBVFAxQjEiLCJDRDI0IikpDQpgYGANCmBgYHtyIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMn0NCkZlYXR1cmVQbG90KG9iamVjdCA9IGFjYzFfY2FuY2VyX2NlbGxzLGZlYXR1cmVzID0gYygiS0lUIiwiQ0xETjMiLCJBTlhBOCIsIkVIRiIsIkVMRjUiLCJLUlQ3IiwiQ0xETjQiLCJMQ04yIiwiTEdBTFMzIiwiV0ZEQzIiLCJBVFAxQjEiLCJDRDI0IikNCiAgICAgICAgICAgICxzbG90ID0gInNjYWxlLmRhdGEiKQ0KYGBgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMn0NCkZlYXR1cmVQbG90KG9iamVjdCA9IGFjYzFfY2FuY2VyX2NlbGxzLGZlYXR1cmVzID0gYygiVFA2MyIsIlRQNzMiLCJDREgzIiwiS1JUMTQiLCJLUlQ1IiwiQUNUQTIiLCJDREgxMSIsIlRBR0xOIiwiTVlMSyIsIkRLSzMiLCJTUEFSQyIsIlRSSU0yOSIpKQ0KYGBgDQpgYGB7ciBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTJ9DQpGZWF0dXJlUGxvdChvYmplY3QgPSBhY2MxX2NhbmNlcl9jZWxscyxmZWF0dXJlcyA9IGMoIlRQNjMiLCJUUDczIiwiQ0RIMyIsIktSVDE0IiwiS1JUNSIsIkFDVEEyIiwiQ0RIMTEiLCJUQUdMTiIsIk1ZTEsiLCJES0szIiwiU1BBUkMiLCJUUklNMjkiKQ0KICAgICAgICAgICAgLHNsb3QgPSAic2NhbGUuZGF0YSIpDQpgYGANCg0KY29ycmVsYXRpb24gb2YgbHVtL215cCBtYXJrZXJzDQpgYGB7cn0NCmx1bV9tYXJrZXJzICA9IEZldGNoRGF0YShvYmplY3QgPSBhY2MxX2NhbmNlcl9jZWxscywgdmFycyA9IA0KICAgICAgICAgICAgICAgICBjKCJLSVQiLCJDTEROMyIsIkFOWEE4IiwiRUhGIiwiRUxGNSIsIktSVDciLCJDTERONCIsIkxDTjIiLCJMR0FMUzMiLCJXRkRDMiIsIkFUUDFCMSIsIkNEMjQiKSkNCmx1bV9jb3IgPSBjb3IobHVtX21hcmtlcnMpDQpwaGVhdG1hcChsdW1fY29yKQ0KDQpgYGANCg0KYGBge3J9DQpteW9fbWFya2VycyAgPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjMV9jYW5jZXJfY2VsbHMsIHZhcnMgPSANCiAgICAgICAgICAgICAgICAgYygiVFA2MyIsIlRQNzMiLCJDREgzIiwiS1JUMTQiLCJLUlQ1IiwiQUNUQTIiLCJDREgxMSIsIlRBR0xOIiwiTVlMSyIsIkRLSzMiLCJTUEFSQyIsIlRSSU0yOSIpKQ0KbXlvX2NvciA9IGNvcihteW9fbWFya2VycykNCnBoZWF0bWFwKG15b19jb3IpDQoNCmBgYA0KDQpgYGB7cn0NCm15b19wcm90ZWlucyA9IEZldGNoRGF0YShvYmplY3QgPSBhY2MxX2NhbmNlcl9jZWxscyx2YXJzID0gYygiQ05OMSIpKQ0KbXlvX3Byb3RlaW5zX2NvciA9IGNvcihteW9fbWFya2VycyxteW9fcHJvdGVpbnMpDQpwaGVhdG1hcChteW9fcHJvdGVpbnNfY29yLGNsdXN0ZXJfY29scyA9IEYsIGNsdXN0ZXJfcm93cyA9IEYsZGlzcGxheV9udW1iZXJzID0gVCkNCmBgYA0KYGBge3J9DQphID0gY29sbmFtZXMoYWNjX2FsbF9jZWxscykgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KYGBgDQoNCg==